package tools

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
	"time"
)

//
// PrintRequestLog
//  @Description: 打印Http访问日志
//  @param r
//
func PrintRequestLog(r *http.Request) {
	now := time.Now().Format("2006-01-02 15:04:05")
	fmt.Printf("[%s] %s%s --> \n", now, r.RemoteAddr, r.RequestURI)
}

// FindIntInSlice
//  @Description: 在一个int类型的切片中，查找一个int数字是否存在
//  @param slice: 传入一个int类型的切片
//  @param val: 要查询是否存在的int值
//  @return bool: 如果要找的int值存在则返回ture，否则返回false
//
func FindIntInSlice(slice []int, val int) bool {
	for _, item := range slice {
		if item == val {
			return true
		}
	}
	return false
}

// RequestUrl
//  @Description: 请求一个接口
//  @param url: 传入请求地址
//  @param method: 传入请求方法
//  @param reqBody: 传入请求body
//  @param headers: 传入请求header，例如传：{ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.164 Safari/537.36" }
//  @return int: 返回状态码
//  @return string: 返回body
//  @return error: 返回错误
//
func RequestUrl(url string, method string, body string, headers string) (int, string, error) {
	// 创建一个Request
	request, err := http.NewRequest(method, url, bytes.NewBuffer([]byte(body)))
	if err != nil {
		fmt.Printf("[创建Http请求错误] %s\n", err.Error())
	}

	// 给Request添加Headers
	if headers != "" {
		headersMap := make(map[string]string, 3) //用来存储Json编码后的数据，初始化map时确定了预估容量，可提高性能
		if err := json.Unmarshal([]byte(headers), &headersMap); err != nil {
			fmt.Printf("Hearder的Json解析失败，URL:%s, Headers: %s, 错误信息: %s\n", url, headers, err.Error())
			panic(err)
		}
		for k, v := range headersMap {
			request.Header.Add(k, v)
		}
	}

	// 发送Request
	client := &http.Client{Timeout: 30 * time.Second} // 每一次访问的超时时间
	resp, err := client.Do(request)
	if err != nil {
		return 0, "error", err
	}

	// 处理http请求返回
	resBody, _ := ioutil.ReadAll(resp.Body)
	defer resp.Body.Close()

	return resp.StatusCode, string(resBody), nil
}
